home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / archiver / pdtar.zip / NAMES.C < prev    next >
C/C++ Source or Header  |  1988-05-15  |  3KB  |  133 lines

  1. /*
  2.  * Look up user and/or group names.
  3.  *
  4.  * This file should be modified for non-unix systems to do something
  5.  * reasonable.
  6.  *
  7.  * @(#)names.c 1.1 9/9/86 Public Domain - gnu
  8.  * MS-DOS port 2/87 by E. Roskos.
  9.  * Minix  port 3/88 by E. Roskos.
  10.  */
  11. #include <sys/types.h>
  12. #ifndef MSDOS
  13. #include <pwd.h>
  14. #include <grp.h>
  15. #endif
  16. #include "tar.h"
  17.  
  18. static int      saveuid = -993;
  19. static char     saveuname[TUNMLEN];
  20. static int      my_uid = -993;
  21.  
  22. static int      savegid = -993;
  23. static char     savegname[TGNMLEN];
  24. static int      my_gid = -993;
  25.  
  26. #define myuid    ( my_uid < 0? my_uid = getuid(): my_uid )
  27. #define    mygid    ( my_gid < 0? my_gid = getgid(): my_gid )
  28.  
  29.  
  30. #ifndef NONAMES
  31. /*
  32.  * Look up a user or group name from a uid/gid, maintaining a cache.
  33.  * FIXME, for now it's a one-entry cache.
  34.  * FIXME2, the "-993" is to reduce the chance of a hit on the first lookup.
  35.  *
  36.  * This is ifdef'd because on Suns, it drags in about 38K of "yellow
  37.  * pages" code, roughly doubling the program size.  Thanks guys.
  38.  */
  39. void
  40. finduname(uname, uid)
  41. char            uname[TUNMLEN];
  42. int             uid;
  43.  
  44. {
  45.     struct passwd  *pw;
  46.     extern struct passwd *getpwuid();
  47.  
  48.     if (uid != saveuid)
  49.     {
  50.         saveuid = uid;
  51.         saveuname[0] = '\0';
  52.         pw = getpwuid(uid);
  53.         if (pw)
  54.             strncpy(saveuname, pw->pw_name, TUNMLEN);
  55.     }
  56.     strncpy(uname, saveuname, TUNMLEN);
  57. }
  58.  
  59. int
  60. finduid(uname)
  61. char            uname[TUNMLEN];
  62.  
  63. {
  64.     struct passwd  *pw;
  65.     extern struct passwd *getpwnam();
  66.  
  67.     if (uname[0] != saveuname[0]/* Quick test w/o proc call */
  68.         || 0 != strncmp(uname, saveuname, TUNMLEN))
  69.     {
  70.         strncpy(saveuname, uname, TUNMLEN);
  71.         pw = getpwnam(uname);
  72.         if (pw)
  73.         {
  74.             saveuid = pw->pw_uid;
  75.         }
  76.         else
  77.         {
  78.             saveuid = myuid;
  79.         }
  80.     }
  81.     return saveuid;
  82. }
  83.  
  84.  
  85. void
  86. findgname(gname, gid)
  87. char            gname[TGNMLEN];
  88. int             gid;
  89.  
  90. {
  91.     struct group   *gr;
  92.     extern struct group *getgrgid();
  93.  
  94.     if (gid != savegid)
  95.     {
  96.         savegid = gid;
  97.         savegname[0] = '\0';
  98.         (void) setgrent();
  99.         gr = getgrgid(gid);
  100.         if (gr)
  101.             strncpy(savegname, gr->gr_name, TGNMLEN);
  102.     }
  103.     (void) strncpy(gname, savegname, TGNMLEN);
  104. }
  105.  
  106.  
  107. int
  108. findgid(gname)
  109. char            gname[TUNMLEN];
  110.  
  111. {
  112.     struct group   *gr;
  113.     extern struct group *getgrnam();
  114.  
  115.     if (gname[0] != savegname[0]/* Quick test w/o proc call */
  116.         || 0 != strncmp(gname, savegname, TUNMLEN))
  117.     {
  118.         strncpy(savegname, gname, TUNMLEN);
  119.         gr = getgrnam(gname);
  120.         if (gr)
  121.         {
  122.             savegid = gr->gr_gid;
  123.         }
  124.         else
  125.         {
  126.             savegid = mygid;
  127.         }
  128.     }
  129.     return savegid;
  130. }
  131.  
  132. #endif
  133.